<html>
<head>
<title>MMBase Remote Services</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<p><b><font size="4">MMBase Remote Services (july 2001)<br>
  <i><font size="3">by David van Zeventer<br>
  VPRO Digitaal</font></i></font></b></p>
<p><b>Index</b></p>
<blockquote> 
  <p><b><a href="#1_introduction">1. Introduction</a><br>
    <a href="#2_representation">2. Representation of a remote service</a><br>
    <a href="#3_controlling">3. Controlling a remote service</a><br>
    <a href="#4_technical">4. Technical information</a></b></p>
  <p><b>Attachments </b></p>
  <p><b><a href="#a1">A1. Sequence diagrams</a></b></p>
  <blockquote> 
    <p><b><a href="#a1_1">A1.1. CDPlayer sequence diagram</a><br>
      <a href="#a1_2">A1.2. G2Encoder sequence diagram</a></b></p>
  </blockquote>
  <p><b><a href="#a2">A2. Required input/output data used by MMbase and Remote 
    services</a><br>
    <a href="#a3">A3. Description of the files used in the remote services system</a><br>
    <a href="#a4">A4. Installation guide</a></b></p>
</blockquote>
<hr>
<p><b><a name="1_introduction"></a>1. Introduction</b></p>
<p>We describe the MMBase Remote Services by describing how the cdplayer services 
  can be used to rip the audio of a CD.<br>
  Any computer running linux with a cd-rom player can offer its cdplayer to MMBase 
  as a remote service. The remote service communicates with MMBase through a small 
  java application and vice versa. With the MMBase editors it is now possible 
  to control the remote cdplayer.<br>
  Currently no remote service implementations for other Operating Systems than 
  linux exist.</p>
<p>MMBase Remote Services were originally designed and implemented by Daniel Ockeloen. 
  Bugfixes and improvements were added by David van Zeventer.</p>
<p><b><a name="2_representation"></a>2. Representation of a remote service</b></p>
<p> For MMBase to be able to communicate with remote services, first the remote 
  machine providing the services has to be known. This can be done by manually 
  creating a so called <i>mmserver </i>object, that will contain the name and 
  address of the machine. <br>
  When the location of MMBase is defined on the remote side, communication is 
  possible between them.</p>
<p>To be able to control the services that are running on the remote machine, 
  a representation of the remote services also has to be created on the MMBase 
  side. This will be done automatically when starting the remote service system.<br>
  After starting the remote services system, a message will be sent to MMBase 
  telling it that its services are available for usage. Inside MMBase this will 
  result in a creation of these services as service nodes. The services will be 
  created by a certain <i>service builder</i>. In case of a cdplayer service, 
  the builder that will create the object will be the <i>cdplayers service builder</i>.</p>
<p><b><a name="3_controlling"></a>3. Controlling a remote service</b></p>
<p>A user can control a cdplayer service through the MMBase audioparts editor. 
  After the user selects that it wants to use a certain CD track as an audiopart, 
  the selected cdplayer object is changed to reflect the users request. <br>
  The cdplayer object change will be sent as a message over the network. </p>
<p>This message contains the following information:</p>
<ul>
  <li>name of the service, eg. CDROM-1</li>
  <li>type of service, eg. cdplayers</li>
  <li>type of change, eg. new node, node was changed.</li>
</ul>
<p>The remote machine eventually receives this message and checks what type of 
  service has been changed. After checking, it will then react by requesting a 
  XML representation of it from MMBase. </p>
<p>The remote cdplayer service node now contains task information and can start 
  performing its task (CD ripping).<br>
  Just before it actually starts the ripping process, the remote side tells MMBase 
  that it's busy by changing the service and sending it in XML format back to 
  MMBase.<br>
  On the MMBase side, the XML data representing the cdplayer that was sent by 
  the remote side is received and merged with the MMBase version. Since the state 
  has become busy, users won't be able to use it's service, since the editors 
  won't put it available.</p>
<p>When the cdplayer has ripped the CD track, it will store the result value of 
  the ripping process in the cdplayer object and it will set the state to indicate 
  it has finished. After that the cdplayer will be sent in XML format to MMBase.<br>
  On the MMBase side, the XML data representing the cdplayer that was sent by 
  the remote side is received and merged with the MMBase version. MMBase will 
  check the cdplayer state and sees that it has performed a CD rip and it will 
  check the rip process exitvalue.<br>
  If everything went ok, the service will be made available to the user, otherwise 
  it will be left unavailable in the error state to be fixed manually.</p>
<p>Note: The remote services system doesn't work perfect. It can happen that a 
  CD ripping process fails. The bugs producing these problems have not yet all 
  been found. </p>
<p><b><a name="4_technical"></a>4. Technical information</b></p>
<p>The diagram below describes what type of objects communicate with each other 
  when using the MMBase remote services.<br>
  In the diagram the arrows are used to show which object requests or sends information 
  to another object. <br>
  Stippled arrows are used to show what <i>node changed</i> signals are sent when 
  a node is being created/deleted/changed. Changes are only received by object 
  types that are listening to change signals.</p>
<p><b><img src="mmbaseremoteservices11.gif" width="591" height="810"></b></p>
<p>&nbsp;</p>
<p>A sequence diagram showing the communication between MMBase and the remote 
  side can be found in section: <b><a href="#a1">A1 Sequence diagrams</a> </b>where 
  A1.1 describes sequence diagram for the cdplayer service and A1.2 for the g2encoder 
  service.</p>
<p>To use a particular service you initialize it by filling the service <u>info</u> 
  field and setting the service <u>state</u> field.<br>
  When the service has performed its task, the remote side code will put the process 
  exitvalue audiopart objectnr it was working for in the <u>info</u> field and 
  the <u>state</u> field will be set to finishing state.<br>
  More detailed information about the service input/ouput values that are used 
  during usage can be found in section: <b><a href="#a2">A2 Required input/output 
  data used by MMbase and Remote services</a>.</b></p>
<p></p>
<p>A description of the files used in the remote services system can be found 
  in section <b><a href="a3">A3 Description of the files used in the remote services 
  system.</a></b></p>
<p>Installation details can be found the attachments section: <b><a href="a">A4 
  Installation guide. </a></b></p>
<p>&nbsp;</p>
<hr>
<p><b>Attachments</b></p>
<p><b><a name="a1"></a>A1. Sequence diagrams</b></p>
<p><b><a name="a1_1"></a>A1.1 Sequence diagram for a cdplayer service</b></p>
<p><img src="seqdiagramcd2.gif" width="630" height="687"></p>
<p>&nbsp;</p>
<p><b><a name="a1_2"></a>A1.2 Sequence diagram for a g2encoder service</b></p>
<p><img src="seqdiagramg2_2.gif" width="499" height="414"></p>
<p>&nbsp;</p>
<p><b><a name="a2"></a>A2 Required input/output data used by MMBase and Remote 
  services.</b></p>
<p>As can be seen above, remote services can be controlled by setting them in 
  an certain state. The data necessary to control services are stored in the <u>service.state</u> 
  field and filling the <u>service.info</u> field.<br>
  These same fields are used by the remote service itself to communicate to the 
  outside world what it is doing.</p>
<table width="94%" border="1">
  <tr> 
    <td width="11%"><b>Service type</b></td>
    <td width="29%"><b>Task</b></td>
    <td width="10%"><b>State field</b></td>
    <td width="50%"><b>Info field <br>
      (id means audiopart objectnr.)</b></td>
  </tr>
  <tr> 
    <td width="11%"><b>cdplayers</b></td>
    <td width="29%"><i>Initial state</i></td>
    <td width="10%">waiting</td>
    <td width="50%"><i>empty</i></td>
  </tr>
  <tr> 
    <td width="11%">cdplayers</td>
    <td width="29%"><i>User requests a tracklisting</i></td>
    <td width="10%">getdir</td>
    <td width="50%"><i>empty</i></td>
  </tr>
  <tr> 
    <td width="11%">cdplayers</td>
    <td width="29%"><i>User has selected a track</i></td>
    <td width="10%">claimed</td>
    <td width="50%">user=Mr. foo lease=3 tracknr=8</td>
  </tr>
  <tr> 
    <td width="11%">cdplayers</td>
    <td width="29%"><i>User saves audiopart, thus requests CDrip.</i></td>
    <td width="10%">record</td>
    <td width="50%">tracknr=1 id=12345</td>
  </tr>
  <tr> 
    <td width="11%">cdplayers</td>
    <td width="29%"><i>Remote service starts ripping.</i></td>
    <td width="10%">busy</td>
    <td width="50%">tracknr=1 id=12345</td>
  </tr>
  <tr> 
    <td width="11%" height="39">cdplayers</td>
    <td width="29%" height="39"><i>Remote service finished ripping successfully.</i></td>
    <td width="10%" height="39">waiting</td>
    <td width="50%" height="39">result=0 id=12345</td>
  </tr>
  <tr> 
    <td width="11%">cdplayers</td>
    <td width="29%"><i>Problem occured during ripping.</i></td>
    <td width="10%">waiting</td>
    <td width="50%">result=8 id=12345</td>
  </tr>
  <tr> 
    <td width="11%">cdplayers</td>
    <td width="29%"><i>MMBase checks result value and resets service if ok, (result=0)</i></td>
    <td width="10%">wating</td>
    <td width="50%"><i>empty</i></td>
  </tr>
  <tr> 
    <td width="11%">&nbsp;</td>
    <td width="29%">&nbsp;</td>
    <td width="10%">&nbsp;</td>
    <td width="50%">&nbsp;</td>
  </tr>
  <tr> 
    <td width="11%"><b>g2encoders</b></td>
    <td width="29%"><i>Initial state</i></td>
    <td width="10%">waiting</td>
    <td width="50%"><i>empty</i></td>
  </tr>
  <tr> 
    <td width="11%">g2encoders</td>
    <td width="29%"><i>MMBase requests service to encode audiofile.</i></td>
    <td width="10%">encode</td>
    <td width="50%">'id=12345 subdir=12345 inputname=/audiolocation/12345.wav 
      outputname=/encodelocation/12345/surestream.rm sureStream=true encodeAudio=true 
      forceOverwrite=true audioFormat=&quot;stereo music&quot;'</td>
  </tr>
  <tr> 
    <td width="11%">g2encoders</td>
    <td width="29%"><i>Remote service starts encoding.</i></td>
    <td width="10%">busy</td>
    <td width="50%">'id=12345 subdir=12345 inputname=/audiolocation/12345.wav 
      outputname=/encodelocation/12345/surestream.rm sureStream=true encodeAudio=true 
      forceOverwrite=true audioFormat=&quot;stereo music&quot;'</td>
  </tr>
  <tr> 
    <td width="11%">g2encoders</td>
    <td width="29%"><i>Remote service encoded successfully.</i></td>
    <td width="10%">waiting</td>
    <td width="50%">result=0 id=12345</td>
  </tr>
  <tr> 
    <td width="11%">g2encoders</td>
    <td width="29%"><i>Problem occured duing encoding.</i></td>
    <td width="10%">waiting</td>
    <td width="50%">result=8 id=12345</td>
  </tr>
  <tr> 
    <td width="11%">g2encoders</td>
    <td width="29%"><i>MMBase checks result value and resets service if ok, (result=0)</i></td>
    <td width="10%">waiting</td>
    <td width="50%"><i>empty</i></td>
  </tr>
</table>
<p>&nbsp;</p>
<p><b><a name="a3"></a>A3 Description of the files used in the remote services 
  system:</b></p>
<p><b><i>On the MMBase side:</i></b></p>
<p><u>HTML files</u><br>
  The following html files are used in the <b>(mm)editors</b> for controlling 
  a cdplayer:<br>
</p>
<p>Located in the audioparts editor <u>source</u> field page.</p>
<ul>
  <li>mmeditors/editparts/audiosource.shtml</li>
  <li>mmeditors/editparts/audioDevice-cdplayers-doClaim.shtml</li>
  <li>mmeditors/editparts/audioDevice-cdplayers-iscdempty.shtml</li>
  <li>mmeditors/editparts/audioDevice-cdplayers.shtml</li>
  <li>mmeditors/editparts/selectAudioDeviceNumber.shtml (this is a PART file)</li>
  <li>mmeditors/editparts/audioDevice-upload.shtml (default file)</li>
</ul>
<p>A new audioparts preview:</p>
<ul>
  <li>mmeditors/previews/audioparts.shtml</li>
</ul>
<p></p>
<p><br>
  <u>JAVA files</u><br>
  The following java files are necessary when working with MMBase remote services. 
  More information about these classes can be found in the classfiles itself.</p>
<p>Files used for representation of the services in MMBase:</p>
<ul>
  <li>MMBase/module/builders/ServiceBuilder.java</li>
  <li>MMBase/module/builders/cdplayers.java</li>
  <li>MMBase/module/builders/g2encoders.java</li>
</ul>
<p>Files used for communicating changes on services to a remote service.<br>
  <b>Note:</b> Currently there's only one working protocoldriver implementation 
  and that is the http implementation. Other implementation do exist but are so 
  much out of date the rest of the remote services system, that they'll probably 
  won't work.</p>
<ul>
  <li>MMBase/module/builders/protocoldrivers/ProtocolDriver.java</li>
  <li>MMBase/module/builders/protocoldrivers/http.java</li>
</ul>
<p>The following two classes control the remote services automatically.<br>
  For example after ripping a audio cd encoding jobs are automatically queued 
  for the services by these classes.<br>
  Also these classes provide some kind of recovery when the MMBase running these 
  files is being reset while busy ripping or encoding, or when just finished when 
  reset occurs. More detailed information can be found in the class headers.<br>
</p>
<ul>
  <li>MMBase/module/builders/vwms/EncodeCop.java</li>
  <li>MMBase/module/builders/vwms/EncodeHandler.java</li>
</ul>
<p><b>Note:</b> The above classes are vwm (VirtualWebMaster) type classes where 
  EncodeCop is a real vwm and EncodeHandler is a helper thread class. The EncodeCop 
  class has to be connected to a mmserver representating a machine with MMbase 
  installed on it. If you've got more than one MMBase, then it should be connection 
  to <b>one</b> of them. The remote services have to communicate to this particular 
  MMBase address. </p>
<p>Files used for handling the incoming requests from remote services:</p>
<ul>
  <li>MMBase/servlet/remoteXML.java </li>
</ul>
<p><br>
  <b>On the remote side:</b></p>
<p>On the remote side, all files in the subdirectories below are needed.</p>
<ul>
  <li>MMBase/remote.*</li>
  <li>MMBase/service.*<br>
  </li>
</ul>
<p>The MMBase/remote subdirectory consists of <u>java</u> files, <u>config</u> 
  files and the remote service <u>startup script</u>.</p>
<p><u>Script files</u><br>
  The remote service startup script is called:</p>
<ul>
  <li>MMBase/remote/startRemoteBuilders.sh<br>
    This is the script that you'd start up to start the remote service.</li>
</ul>
<p><u>Config files</u><br>
  Two types of config files exist:</p>
<blockquote> 
  <p>Server config file, containing information about the name of the machine 
    that's running services and the connection &amp; location with MMBase.<br>
    Service config file, containing information about the type of service, implementation 
    details and how it is known to the outside world.</p>
</blockquote>
<ul>
  <li>MMBase/remote/server.properties<br>
    This file contains 3 properties.<br>
    <b>name:</b> In MMBase the machine hosting one or more services is represented 
    by a mmserver object. The name key is the name of the mmserver. 
    <p><b>connection:</b> The remote machine communicates with MMBase over a connection. 
      The connection holds the address of the machine running MMBase. <b>Note:</b> 
      This has to be the address of the MMBase system that also runs the vwms 
      EncodeCop &amp; EncodeHandler.<br>
      eg. connection=http://your.system.name:yourport</p>
    <p><b>sharedsecret:</b> The shared secret is used by MMBase and remoteBuilder 
      to be able<br>
      to authenticate each other, so be sure that this sharedsecret is the<br>
      same on your different systems<br>
      eg. sharedsecret=AFSDLK234234SLKFJ234lKASFLDKJ34</p>
  </li>
  <li>MMBase/remote/cdplayer.properties<br>
    This file contains 3 properties.<br>
    <b>buildername:</b> The name of the service builder that creates a representation 
    of the service on in MMBase. -&gt; buildername=cdplayers 
    <p><b>nodename:</b> The name of the service as it is known by in MMBase. Instead 
      of using objectnumbers the MMBase remote service system uses specific names 
      to represent the service.<br>
      eg. nodename=CDROM-1</p>
    <p><b>implementation:</b> The classpath to the file with the implementation 
      of the service<br>
      <b>Note:</b> Currently there's only one working implementation and that 
      is for the linux platform.<br>
      eg. implementation: org.MMBase.service.implementations.cdplayers.LiteOn242Linux</p>
  </li>
  <li>MMBase/remote/g2encoder.properties <br>
    This file contains 3 properties. 
    <p><b>buildername:</b> The name of the service builder that creates a representation 
      of the service on in MMBase. -&gt; buildername=g2encoders</p>
    <p><b>nodename:</b> The name of the service as it is known by in MMBase. Instead 
      of using objectnumbers the MMBase remote service system uses specific names 
      to represent the service.<br>
      eg. nodename=G2ENCODER_BEEP</p>
    <p><b>implementation:</b> The classpath to the file with the implementation 
      of the service.<br>
      <b>Note:</b> Currently there's only one working implementation and that 
      is for the unix/linux platform. <br>
      eg. implementation: org.MMBase.service.implementations.g2encoders.g2encoderUnix</p>
  </li>
</ul>
<p>&nbsp;</p>
<p><u>JAVA files</u><br>
</p>
<p>Next I'll give a summary of the most important files within the remote services 
  system.</p>
<p>File that starts up the remote services depending on the property files:</p>
<ul>
  <li>startRemoteBuilders.java</li>
</ul>
<p><br>
  The MMProtocolDriver is an interface file desribing through which methods protocoldrivers 
  have to communicate:</p>
<ul>
  <li>MMBase/remote/MMProtocolDriver.java</li>
</ul>
<p><br>
  The MMHttpAcceptor file is the HTTP implementation of the protocol driver that 
  sends and receives requests. Other implementations have become out of date and 
  probably won't work with the current version of the remote services system. 
  <br>
  The incoming requests from MMBase are service changes signals, that will result 
  in requesting the service itself from the MMBase side. When the remote service 
  changes the service itself, it will send POST requests to MMBase sending the 
  new service.<br>
</p>
<ul>
  <li>MMBase/remote/MMHttpAcceptor.java <br>
  </li>
</ul>
<br>
The MMHttpHandler file is used by the acceptor to handle the incoming requests 
received by the accecptor. The request querystring contains info that a service 
state has been changed which the handler will signal through the remote service 
system as a remote service changed signal.<br>
<ul>
  <li>MMBase/remote/MMHttpHandler.java </li>
</ul>
<p><br>
  The MMRemoteProbe file is a maintainance probe thats uses the protocoldriver 
  to send the machine mmserver state to the MMBase side, letting it know it's 
  still running.<br>
  After letting MMBase know it's still alive, it calls the service maintainance 
  routines.</p>
<ul>
  <li>MMBase/remote/MMRemoteProbe.java </li>
</ul>
<p><br>
  A service is represented by the RemoteBuilder file. When implementing a specific 
  service representation, you extend from this file. Note that these files only 
  describe the service itself. Actual lowlevel control of the service is described 
  by the files MMBase/service/* which will be described after this.<br>
</p>
<ul>
  <li>mmbase/remote/RemoteBuilder.java<br>
  </li>
  <li>mmbase/remote/builders/cdplayers.java<br>
  </li>
  <li>mmbase/remote/builders/g2encoders.java</li>
</ul>
<p></p>
<p><br>
  Lowlevel control of the actual service (eg. CDROM Player, Encoding Software) 
  is located in the mmbase/service packages. software that The interface to the 
  service itself (eg. cdplayer) and its implementation for a specific platform 
  is described by these files.<br>
  Currenly only a unix/linux cdplayer implementation exists. The same goes for 
  the implementation of the G2 encoder service.<br>
</p>
<ul>
  <li>mmbase/service/serviceInterface.java<br>
  </li>
  <li>mmbase/service/interfaces/cdplayerInterface.java<br>
  </li>
  <li>mmbase/service/interfaces/g2encoderInterface.java<br>
  </li>
  <li>mmbase/service/implementations/cdplayers/LiteOn242Linux.java<br>
  </li>
  <li>mmbase/service/implementations/g2encoders/g2encoderUnix.java</li>
</ul>
<p><br>
  Unix/Linux software that's controlled by the implementations are:</p>
<ul>
  <li> cdthing (used for getting the tracklisting)</li>
  <li> cdda2wav (used for ripping a cdtrack from an audio CD</li>
  <li> realproducer (used for realencoding wav files.</li>
</ul>
<p>&nbsp;</p>
<p></p>
<p><b><a name="a4"></a>A4 Installation guide</b></p>
<p>The following is a step by step description on how to setup a remote cdplayer 
  service.</p>
<p><i><b>On the MMBase side</b></i></p>
<ul>
  <li> Activate the following builders xml configs</li>
</ul>
<blockquote> 
  <ul>
    <li>builders/audioparts.xml</li>
    <li>builders/cdplayers.xml</li>
    <li>builders/mmservers.xml (in default mmbase install)</li>
    <li>builders/properties.xml (in default mmbase install)</li>
    <li>builders/rawaudios.xml</li>
    <li>builders/vwms.xml</li>
  </ul>
</blockquote>
<ul>
  <li>Get the security.xml file from security/security.xml and change the <i>shared 
    secret key</i>.<br>
    Note: You don't have to activate the security manager to use this key!</li>
</ul>
<ul>
  <li>Reset MMBase sothat these builders are loaded.</li>
</ul>
<ul>
  <li>Create an mmserver object with the mmservers editor for the machine containing 
    the remote service, setting the fields to: </li>
</ul>
<blockquote> 
  <blockquote> 
    <p><b>name:</b> name by which the machine mmserver is known.<br>
      <b>state:</b> 2 (Active)<br>
      <b>host:</b> full url to the machine running remote services. (eg. http://www.myremotemachine.com:6060)<br>
      <b>os:</b> os running on the machine (not necessary)<br>
      <b>jdk:</b> the java version running on the machine (not necessary)<br>
    </p>
  </blockquote>
</blockquote>
<ul>
  <li>Create a vwm object with the vwm editor for the EncodeCop vwm:</li>
</ul>
<blockquote> 
  <blockquote> 
    <p><b>name:</b> EncodeCop<br>
      <b>status:</b> 2 (Active)<br>
      <b>description:</b> Vwm that controls ripping and encoding process of remote 
      services.<br>
      <b>classname:</b> mmbase.module.builders.vwms.EncodeCop<br>
    </p>
  </blockquote>
</blockquote>
<ul>
  <li>Connect the EncodeCop vwm to the mmserver object representing the MMBase 
    system. <br>
    <br>
  </li>
  <li>Reset MMBase sothat the just created MMServer and EncodeCop object is being 
    loaded correctly.</li>
</ul>
<p>&nbsp;</p>
<p><i><b>On the Remote side</b></i></p>
<ul>
  <li>Download mmbase on the machine with the cdplayer service.<br>
    <br>
  </li>
  <li>Download jdk1.2 or higher.<br>
    <br>
  </li>
  <li>Download software that's used by the remote system for controlling the cdplayer.<br>
    (Currenly only linux software can be controlled since only those java implementations 
    exist)<br>
    Software used: 
    <ul>
      <li>cdthing for retrieving tracklistings</li>
      <li>cdda2wav for rippng.<br>
        <br>
      </li>
    </ul>
  </li>
  <li>Change the dummy config file mmbase/remote/server.properties. 
    <ul>
      <li> Set the <b>name</b> property to the same value as the mmserver.name 
        of the object created to represent the remote machine in MMBase.</li>
      <li>Set the <b>connection </b>property to point to the url where MMBase 
        system is running. (If you've got more than one MMBase, then let it point 
        to the MMBase system that also runs the EncodeCop vwm.)</li>
      <li>Set the <b>sharedsecret </b>key to the same value as specified in the 
        security.xml on the MMBase side.</li>
    </ul>
  </li>
</ul>
<ul>
  <li>Change the dummy config file mmbase/remote/cdplayer.properties. 
    <ul>
      <li>Set the <b>buildername </b>to the type of service that's running on 
        your remote machine. Since this is the cdplayer.properties file, the buildername 
        value is 'cdplayers', thus this one can be left unchanged.</li>
      <li>Set the <b>nodename</b> property to a value that you want the service 
        to be called.</li>
      <li>Set the <b>implementation</b> property to point to the java implementation 
        that controls the software that controls the service. If you want to use 
        the linux implementation this value is: org.mmbase.service.implementations.cdplayers.LiteOn242Linux</li>
    </ul>
  </li>
</ul>
<ul>
  <li>Change the dummy startupscript mmbase/remote/startRemoteBuilders.sh<br>
    In here you'll have to set <b>CLASSPATH </b>to your classpath. If necessary 
    change the directory to the location of the config files. And finally change 
    if necessary the <b>java command arguments </b>for the startRemoteBuilders 
    application sothat it will start the cdplayer service.<br>
    eg. java mmbase.remote.startRemoteBuilders server.properties <b>cdplayer.properties 
    </b>2&gt;&amp;1| cat &gt;&gt;remoteBuilder.log<br>
  </li>
</ul>
<ul>
  <li>Start the startup script startRemoteBuilders.sh<br>
    The remote service system will post the service object in XML format to the 
    MMBase side. MMBase will then check the incoming xml node and if everything 
    is ok it will insert a service node.</li>
</ul>
<ul>
  <li>The remote service can now be controlled by controlling the MMBase side 
    service node. </li>
</ul>
</body>
</html>
